package com.b2mining.daemons;

import java.util.*;import java.io.*;import javax.mail.*;import javax.mail.internet.*;import javax.activation.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import com.b2mining.integration.beans.Empresa;
import com.b2mining.integration.helper.Constantes;
import com.b2mining.integration.helper.EnviarMail;
import com.b2mining.integration.mq.IncorrectMessageFormatException;
import com.b2mining.integration.mq.MQConn;
import com.b2mining.integration.mq.MQConnectionException;
import com.b2mining.integration.mq.MQIntegrationMessage;

/**
 * Clase encargada de leer los mensajes que llegan a las colas de entrada del MQSeries y
 * procesarlos de acuerdo al codigo de accion con el controlador determinado. Es usado por los 
 * tres procesos(Base de Datos, Archivos XML o CSV)
 * @since (7/4/2003 1:12:20 PM)
 * @author Synopsis S.A. <BR>
 * Analistas Programadores: Janyn Roca, Miguel Lora G.
 */

public class MQReader extends Thread {
	static MQConn conn;

	static ArrayList listaProcesos = new ArrayList();
	static int flagCorrelationId;
	static SimpleDateFormat dateFormatter =	new SimpleDateFormat("(dd-MM-yyyy  hh:mm:ss)");
	static boolean logging = true;
	String nameFile = "";
	boolean MultiEmpresa = false;
	Logger log;
	Empresa ex=null;
	
	public MQReader(Empresa empre) {
		super();
		log = Logger.getLogger(this.getClass());
		ex=empre;
		flagCorrelationId = 0;
	}
        
	public MQReader() {
		super();
		log = Logger.getLogger(this.getClass());
		flagCorrelationId = 0;
	}
	
	public MQReader(MQConn connection,int newFlagCorrelationId) {
		super();
		log = Logger.getLogger(this.getClass());
		conn = connection;
		flagCorrelationId = newFlagCorrelationId;
	}

	/**
	 * Lee el mensaje que llega por la cola y lo guarda en un objeto de la clase 
	 * MQIntegrationMessage.Luego de acuerdo al codigo de accion identificado lo procesa con el controlador determinado.
	 * A traves del archivo de propiedades identifica que tipo de proceso es(BD, Archivos XML o CSV) y 
	 * el tipo de Cliente(Comprador o Proveedor)
	 * Creation date: (7/3/2003 10:45:09 AM)
	 */
	public void procesa() {
		log.debug("MQReader Iniciado: "+(new java.util.Date()));
		MQIntegrationMessage message   = new MQIntegrationMessage();
		
		while (true) {
			try {
                boolean next = message.build(conn,flagCorrelationId);
				if (!next) break;
				log.debug("Mensaje: "+message.getHeader()+message.getBody());
				log.debug("Header : "+message.getHeader());
				log.debug("Action : "+message.getAction());
				log.debug("Orgid : "+message.getOrgId());
				log.debug("Orguserid : "+message.getOrgUserId());
				message.setOrgUserId(message.getOrgUserId().replace('/','-'));
				log.debug("Orguserid sin /: "+ message.getOrgUserId());
				message.setOrgUserId(message.getOrgUserId().replace('\\','-'));
				log.debug("Orguserid sin \\: "+ message.getOrgUserId());
				log.debug("Errorcode : "+message.getErrorCode());
				log.debug("Body : "+message.getBody());
                log.debug("MqCorrelationIq : "+message.getMqCorrelationId());

                	int codigo = 0;
                	try {
                		log.debug("message.getErrorCode() = |" + message.getErrorCode() +"|");
                		codigo = Integer.parseInt(message.getErrorCode());
                	}
                	catch(Exception e) {
                		log.debug("Exception:_ " + e.toString());
                		log.debug("Codigo de Error no es numerico");
                	}
                	
                	if (codigo == 0) {
                		log.debug("Codigo de Error igual a cero");
                	}
                	else {
                		log.debug("Codigo de Error diferente de cero");
                	}
			} 
			catch (Exception e) {
				log.debug("Error en MQReader:"+e);
				String error=e.toString();
				if (e instanceof MQConnectionException){
					log.debug("Seteando la variable isConnected a false");
					conn.setIsConnected(false);
					conn.setErrorLectura(e.toString());
					// enviar correo
					String subject = Constantes.SUBJECTERRORCOLARECEIVED;
			        String messages = Constantes.CUERPOERRORCOLARECEIVED + Constantes.ERRORJAVA+ error;
			        log.debug("Subject "+subject+" messages "+messages);
			        EnviarMail.enviandoMailError(subject,messages,message.getAction(),
			        		message.getDocNumber());
				
						break;
				}
				else
					if (e instanceof IncorrectMessageFormatException){
						// enviar correo
						String subject = Constantes.SUBJECTERRORCOLAINCORRECTMESSAGEFORMATRECEIVED;
				        String messages = Constantes.CUERPOERRORCOLAINCORRECTMESSAGEFORMATRECEIVED 
				        	+ Constantes.ERRORJAVA+ error;
				        log.debug("Subject "+subject+" messages "+messages);
				        EnviarMail.enviandoMailError(subject,messages,message.getAction(),
				        		message.getDocNumber());
					}
			}// fin del catch
		}//del while(true)
		
		log.debug("Componente en suspension MQReader: "+(new java.util.Date()));
	}
}

